Ext.onReady(function()
    {
        var h_mismo_nombre =function(){
            X.focus('materiaMateria');
        };
   
        //Stores
        X.aStore({
            id     : 'marcaStore',
            fields : [ 'idMarca','nombre' ],
            data   : [ [1,'Si'],[2,'No'] ]
        });
        X.store({
            id     : 'storeResponsable',
            fields : [ 'profesor','categoria','marca' ]
        });
        X.store({
            id     : 'storeCategoria',
            fields : [ 'idCategoria', 'nombre' ]
        });

        X.store({
            id     : 'storeProfesor',
            fields : [ 'idProfesor', 'nombre', 'apellido',
            {
                name: 'nombreCompleto',
                mapping:'apellido+", "+obj.nombre'
            } ]
        });
        X.store({
            id      : 'storeMateria',
            fields  : [ 'idCarreraMateria','nombre','horasCatedra','tipo' ]
        });
        X.store({
            id     : 'storeCarrera',
            fields : [ 'idCarrera', 'nombre' , 'duracionHora' ]
        });
        X.store({
            id     : 'storeDetalle',
            fields : [ 'aula','dia','inicio','fin','horas','tipo' ]
        });
        X.store({
            id     : 'storeAula',
            fields : [ 'idAula', 'nombre' ]
        });
        X.aStore({
            id     : 'diaStore',
            fields : [ 'idDia','nombre' ],
            data   : [ [1,'Lunes'],[2,'Martes'],[3,'Miércoles'],[4,'Jueves'],
            [5,'Viernes'],[6,'Sábado'],[7,'Domingo'] ]
        });

        //renderers
        var columnRenderer = function(value){
            var combo = this.editor
            var r = combo.findRecord(combo.valueField, value);
            return r ? r.get(combo.displayField) : combo.valueNotFoundText;
        }

         var duracion = new X.form.number({
            maxlen:4
        });

        var finEdit=new X.form.time({
            minValue : '6:00 AM',
            maxValue : '11:00 PM',
            format   : 'H:i',
            increment: 1
        })

        finEdit.addListener('select',function( combo, record, index ){
            var grid= X.get('materiasGrid');
            var a=grid.getSelectionModel().getSelected();
            var ini=a.data.inicio;
            var fin=record.data.field1;

            if(!ini || !fin){
                a.data.horas=0;

            }
            else{
                var combo_carrera=X.get('carrera').getValue();
                var horas_index = X.get('storeCarrera').findExact('idCarrera', combo_carrera);
                var horas_carrera=X.get('storeCarrera').getAt(horas_index).get('duracionHora');
                var hIni  = 60*parseInt(ini.substr(0,2),10)+parseInt(ini.substr(3,5),10);
                var hFin  = 60*parseInt(fin.substr(0,2),10)+parseInt(fin.substr(3,5),10);
               // a.data.horas= (hFin-hIni)/horas_carrera;
               a.data.horas= Math.floor((hFin-hIni)/horas_carrera);


            }
        });

        finEdit.addListener('change',function( field, newValue, oldValue ){
            var grid= X.get('materiasGrid');
            var a=grid.getSelectionModel().getSelected();
            var ini=a.data.inicio;
            var fin=newValue

            if(!ini || !fin){
                a.data.horas=0;

            }else{
                var combo_carrera=X.get('carrera').getValue();
                var horas_index = X.get('storeCarrera').findExact('idCarrera', combo_carrera);
                var horas_carrera=X.get('storeCarrera').getAt(horas_index).get('duracionHora');
                var hIni  = 60*parseInt(ini.substr(0,2),10)+parseInt(ini.substr(3,5),10);
                var hFin  = 60*parseInt(fin.substr(0,2),10)+parseInt(fin.substr(3,5),10);
                //a.data.horas = (hFin-hIni)/horas_carrera;
                a.data.horas = Math.floor((hFin-hIni)/horas_carrera);


            }
        });

        var iniEdit=new X.form.time({
            minValue : '6:00 AM',
            maxValue : '11:00 PM',
            format   : 'H:i',

            increment: 1
        })
        iniEdit.addListener('select',function( combo, record, index ){
            var grid= X.get('materiasGrid');
            var a=grid.getSelectionModel().getSelected();
            var fin=a.data.fin;
            var ini=record.data.field1;
            if(!ini || !fin){
                a.data.horas=0;
            }
            else{
                var combo_carrera=X.get('carrera').getValue();
                var horas_index = X.get('storeCarrera').findExact('idCarrera', combo_carrera);
                var horas_carrera=X.get('storeCarrera').getAt(horas_index).get('duracionHora');
                var hIni  = 60*parseInt(ini.substr(0,2),10)+parseInt(ini.substr(3,5),10);
                var hFin  = 60*parseInt(fin.substr(0,2),10)+parseInt(fin.substr(3,5),10);
                //a.data.horas = (hFin-hIni)/horas_carrera;
                a.data.horas = Math.floor((hFin-hIni)/horas_carrera);
            }
        });

        iniEdit.addListener('change',function( field, newValue, oldValue ){
            var grid= X.get('materiasGrid');
            var a=grid.getSelectionModel().getSelected();
            var fin=a.data.fin;
            var ini=newValue;
            if(!ini || !fin){
                a.data.horas=0;
            }else{
                var combo_carrera=X.get('carrera').getValue();
                var horas_index = X.get('storeCarrera').findExact('idCarrera', combo_carrera);
                var horas_carrera=X.get('storeCarrera').getAt(horas_index).get('duracionHora');
                var hIni  = 60*parseInt(ini.substr(0,2),10)+parseInt(ini.substr(3,5),10);
                var hFin  = 60*parseInt(fin.substr(0,2),10)+parseInt(fin.substr(3,5),10);
               // a.data.horas = (hFin-hIni)/horas_carrera;
                a.data.horas = Math.floor((hFin-hIni)/horas_carrera);
            }
        });

        //Modelos de columnas
        var colModelResp = new Ext.grid.ColumnModel({
            defaults: {
                menuDisabled: true
            },
            columns: [
            {
                header: 'Profesor',
                dataIndex: 'profesor',
                width : 196,
                editor: new X.form.combo({
                    dfield  :'nombreCompleto',
                    vfield  :'idProfesor',
                    storeId :'storeProfesor'
                }),
                renderer: columnRenderer
            },{
                header: 'Categoría',
                dataIndex: 'categoria',
                width : 75,
                editor: new X.form.combo({
                    dfield  :'nombre',
                    vfield  :'idCategoria',
                    storeId :'storeCategoria'
                }),
                renderer: columnRenderer
            },{
                header: 'Marca',
                dataIndex: 'marca',
                width : 55,
                editor: new X.form.combo({
                    dfield  :'nombre',
                    vfield  :'idMarca',
                    storeId :'marcaStore'
                }),
                renderer: columnRenderer
            }
            ]
        });

        var colModelMat = new Ext.grid.ColumnModel({
            defaults: {
                menuDisabled: true
            },
            columns: [
            {
                header: 'Aula',
                dataIndex: 'aula',
                width : 60,
                editor: new X.form.combo({
                    dfield  :'nombre',
                    vfield  :'idAula',
                    storeId :'storeAula'
                }),
                renderer: columnRenderer
            },{
                header: 'Día',
                dataIndex: 'dia',
                width : 80,
                editor: new X.form.combo({
                    dfield  :'nombre',
                    vfield  :'idDia',
                    storeId :'diaStore'
                }),
                renderer: columnRenderer
            },{
                header: 'Inicio',
                dataIndex: 'inicio',
                width : 60,
                editor:iniEdit
            },{
                header: 'Fin',
                dataIndex: 'fin',
                width : 60,
                editor: finEdit
            },{
                header: 'Horas Cátedra',
                dataIndex: 'horas',
                width   : 100,
                editor: duracion
            },{
                header: 'Tipo',
                hidden: true
            }
            ]
        });
        
        //GRIDS
        X.grid.editor({
            id          : 'responsablesGrid',
            title       : 'Responsables',
            collapsed   : false,
            height      : 200,
            width       : 400,
            cm          : colModelResp,
            storeId     : 'storeResponsable',
            x           : 50,
            y           : 270,
            tbar : new Ext.Toolbar({
                items:[
                X.form.button({
                    text:'Agregar',
                    id:'addResponsable',
                    icon:'/img/icon_agregar.png'
                }),'-',
                X.form.button({
                    text:'Eliminar',
                    id:'remResponsable',
                    icon:'/img/icon_eliminar.png'
                })
                ]
            })
        });
        X.grid.editor({
            id          : 'materiasGrid',
            title       : 'Horarios',
            collapsed   : false,
            height      : 200,
            width       : 400,
            cm          : colModelMat,
            storeId     : 'storeDetalle',
            x           : 50,
            y           : 50,
            tbar : new Ext.Toolbar({
                items:[
                X.form.button({
                    text:'Agregar',
                    id:'addDetalle',
                    icon:'/img/icon_agregar.png'
                }),'-',
                X.form.button({
                    text:'Eliminar',
                    id:'remDetalle',
                    icon:'/img/icon_eliminar.png'
                })
                ]
            })
        });



        X.form.panel({
            title  : 'Cargar Materia',
            id     : 'materiaForm',
            height : 550,
            width  : 500,
            items  : [
            X.form.label ({
                x:10,
                y:16,
                text:'Materia:'
            }),
            X.form.combo({
                id:'materiaMateria',
                x:90,
                y:16,
                width:200,

                dfield  :'nombre',
                vfield  :'idCarreraMateria',
                storeId :'storeMateria'

            }),
            X.get('materiasGrid'),
            X.get('responsablesGrid'),
            X.form.button ({
                x:150,
                y:480,
                width:80,
                id:'cargarMateriaResp',
                text:'cargar'/*,
                disabled: true*/
            }),
            X.form.button ({
                x:250,
                y:480,
                width:80,
                id:'materiaCancelar',
                text:'cancelar'/*,
                disabled: true*/
            })
            ]
        });

        //botones para agregar y quitar
        X.event.button('addResponsable', function(){
            var grid = X.get('responsablesGrid');
            grid.stopEditing();
            grid.store.insert(0, new grid.store.recordType({}));
            grid.startEditing(0,0);
            grid.getSelectionModel().selectRow(0);
        });

        X.event.button('remResponsable', function(){
            var grid = X.get('responsablesGrid');
            var record = grid.getSelectionModel().getSelected();
            if (record) {
                var index = grid.store.indexOf(record);
                grid.store.removeAt(index);
                if (index < grid.store.getCount())
                    grid.getSelectionModel().selectRow(index);
                else
                    grid.getSelectionModel().selectRow(index-1);
            }
        });
        X.event.button('addDetalle', function(){
            var grid = X.get('materiasGrid');
            grid.stopEditing();
            grid.store.insert(0, new grid.store.recordType({}));
            grid.startEditing(0,0);
            grid.getSelectionModel().selectRow(0);
        });

        X.event.button('remDetalle', function(){
            var grid = X.get('materiasGrid');
            var record = grid.getSelectionModel().getSelected();
            if (record) {
                var index = grid.store.indexOf(record);
                grid.store.removeAt(index);
                if (index < grid.store.getCount())
                    grid.getSelectionModel().selectRow(index);
                else
                    grid.getSelectionModel().selectRow(index-1);
            }
        });
    
        //Funciones de carga y cancelacion
        X.event.button('cargarMateriaResp', function(){
            var gridMateriasPrincipalR= X.get('materiasPrincipalGrid');
            var gridRespPrincipal= X.get('responsablesPrincipalGrid');
            var gridMaterias= X.get('materiasGrid');
            var gridResp= X.get('responsablesGrid');
            gridMateriasPrincipalR.expand();
            gridRespPrincipal.expand();
            var storeM=X.get('storeDetallePrincipal');
            var storeR=gridResp.store;
            var Materia = X.get('materiaMateria').getValue();
            gridMateriasPrincipalR.stopEditing();
            var horasT = 0;
            var profesorP =0;
            if(gridMaterias.store.getCount()<1){
                X.msg.failure('Debe agregar al menos un horario', h_mismo_nombre);
                return;
            }
            for (var i=0;i<gridMateriasPrincipalR.store.getCount();i++){
                if(Materia==gridMateriasPrincipalR.store.getAt(i).get('materia')){
                    X.msg.failure('Esta materia ya fue cargada', h_mismo_nombre);
                    return;
                }
            }
            for (i=0;i<gridMaterias.store.getCount();i++){
                //                if(!gridMaterias.store.getAt(i).get('aula')){
                //                    X.msg.failure('Debe completar el campo aula de todas las entradas de horario', h_mismo_nombre);
                //                    return;
                //                }
                if(!gridMaterias.store.getAt(i).get('dia')){
                    X.msg.failure('Debe completar el campo dia de todas las entradas de horario', h_mismo_nombre);
                    return;
                }
                if(!gridMaterias.store.getAt(i).get('inicio')){
                    X.msg.failure('Debe completar el campo inicio de todas las entradas de horario', h_mismo_nombre);
                    return;
                }
                if(!gridMaterias.store.getAt(i).get('fin')){
                    X.msg.failure('Debe completar el campo fin de todas las entradas de horario', h_mismo_nombre);
                    return;
                }
                if(gridMaterias.store.getAt(i).get('fin')<=gridMaterias.store.getAt(i).get('inicio')){
                    X.msg.failure('El fin del horario debe ser posterior al inicio', h_mismo_nombre);
                    return;
                }
            }
            for (i=0;i<gridResp.store.getCount();i++){
                if(!gridResp.store.getAt(i).get('profesor')){
                    X.msg.failure('Debe completar el campo profesor de todas las entradas de responsables', h_mismo_nombre);
                    return;
                }
                if(!gridResp.store.getAt(i).get('categoria')){
                    X.msg.failure('Debe completar el campo categoria de todas las entradas de responsables', h_mismo_nombre);
                    return;
                }
                if(!gridResp.store.getAt(i).get('marca')){
                    X.msg.failure('Debe completar el campo marca de todas las entradas de responsables', h_mismo_nombre);
                    return;
                }
            }
            var j;
            var inicio1;
            var inicio2;
            var fin1;
            var fin2;
            //  alert(gridMaterias.store.getCount());

            for (i=0;i<gridMaterias.store.getCount();i++){
                for(j=0;j<gridMaterias.store.getCount();j++){
                    if ((i!=j) && (gridMaterias.store.getAt(i).get('dia')==gridMaterias.store.getAt(j).get('dia'))){
                        // ninguna de las dos materias a comparar debe ser de tipo C (tipo C no controla solapamiento de horas
                        if(gridMaterias.store.getAt(i).get('tipo')!= 'C' && gridMaterias.store.getAt(j).get('tipo') != 'C'){
                            inicio1=gridMaterias.store.getAt(i).get('inicio');
                            inicio2=gridMaterias.store.getAt(j).get('inicio');
                            fin1=gridMaterias.store.getAt(i).get('fin');
                            fin2=gridMaterias.store.getAt(j).get('fin');

                            if((inicio1>inicio2 && inicio1<fin2) || (inicio2>inicio1 && inicio2<fin1) || (fin1>inicio2 && fin1<fin2) || (fin2>inicio1 && fin2<fin1) || (inicio1==inicio2 && fin1==fin2)){
                                X.msg.failure('Los horarios de esta materia se solapan', h_mismo_nombre);
                                return;
                            }
                        }
                    }
                }
            }
            for (i=0;i<storeM.getCount();i++){
                for(j=0;j<gridMaterias.store.getCount();j++){
                    if (storeM.getAt(i).get('dia')==gridMaterias.store.getAt(j).get('dia')){
                       
                        inicio1=storeM.getAt(i).get('horaInicio');
                        inicio2=gridMaterias.store.getAt(j).get('inicio');
                        fin1=storeM.getAt(i).get('horaFin');
                        fin2=gridMaterias.store.getAt(j).get('fin');
                        // alert(inicio1+" inicios "+inicio2+" "+fin1+" fines "+fin2 );
                        if((inicio1>inicio2 && inicio1<fin2) || (inicio2>inicio1 && inicio2<fin1) || (fin1>inicio2 && fin1<fin2) || (fin2>inicio1 && fin2<fin1) || (inicio1==inicio2 && fin1==fin2)){
                            //alert('hola');
                            var storeL=X.get('storeMateria');
                            // alert('hola');
                            var z=storeL.findExact('idCarreraMateria', storeM.getAt(i).get('idCarreraMateria'));
                            var name=storeL.getAt(z).get('nombre');
                           
                            X.msg.failure('Los horarios de esta materia se solapan con la materia:'+name+' ',h_mismo_nombre);
                            return;
                        }
                    }
                }
            }
            for (  i=0; i<gridMaterias.store.getCount(); i++){
                var defaultData = {
                    idCarreraMateria:Materia,
                    idAula:gridMaterias.store.getAt(i).get('aula'),
                    dia:gridMaterias.store.getAt(i).get('dia'),
                    horaInicio:gridMaterias.store.getAt(i).get('inicio'),
                    horaFin:gridMaterias.store.getAt(i).get('fin'),
                    duracionHoras:gridMaterias.store.getAt(i).get('horas')
                };

                horasT=gridMaterias.store.getAt(i).get('horas')+horasT;
                var p = new storeM.recordType(defaultData);
                storeM.add(p);
            }
            gridMaterias.store.removeAll();
            gridRespPrincipal.stopEditing();
            for ( i=0; i<storeR.getCount(); i++){
                //('codigo de profesor'+storeR.getAt(i).get('profesor'));
                defaultData = {
                    idCarreraMateria:Materia,
                    idProfesor:storeR.getAt(i).get('profesor'),
                    idCategoria:storeR.getAt(i).get('categoria'),
                    marca:storeR.getAt(i).get('marca')
                };
                profesorP = profesorP +1;
                p = new gridRespPrincipal.store.recordType(defaultData);
                gridRespPrincipal.store.add(p);
            }
            storeR.removeAll()
            gridMateriasPrincipalR.stopEditing();
            var materiaID=Materia;
            storeL=X.get('storeMateria');
            z=X.get('storeMateria').find('idCarreraMateria', materiaID);
            var horasp=X.get('storeMateria').getAt(z).get('horasCatedra');
            defaultData = {
                materia:Materia,
                horas:horasT,
                profesores:profesorP,
                horasT:horasp
            };
            p = new gridMateriasPrincipalR.store.recordType(defaultData);
            gridMateriasPrincipalR.store.add(p);
            Materia= '';
            X.get('materiaMateria').setValue('');
            X.hide('materiaWindow');
        });
       
        X.event.button('materiaCancelar', function(){
            X.get('materiaMateria').setValue('');
            X.get('materiasGrid').store.removeAll();
            X.get('responsablesGrid').store.removeAll();

            X.hide('materiaWindow');
        });
        //evento de carga
        X.win.panel({
            id            : 'materiaWindow',
            defaultButton : 'materiaMateria',
            resizable: false,
            items         : X.get('materiaForm')
        });
    });